\chapter{Computação em Nuvem}
\label{cap:computacao_nuvem}

O objetivo deste capítulo é apresentar, inicialmente, o paradigma de computação
distribuída chamado computação em nuvem, deixando claro todas as suas
particularidades e características. Também serão ressaltadas as suas diferenças
entre as principais prestadoras desse serviço.
Em seguida, na Seção~\ref{sec:conceitos_basicos}, serão detalhados os conceitos
da computação em nuvem, o surgimento da ideia, o funcionamento da tecnologia, e
as suas camadas de abstração. Logo após, tem-se a
Seção~\ref{sec:federacao_nuvens}, na qual são demonstrados os objetivos da
federação em nuvens, sua definição e suas fases. Por último, na
Seção~\ref{sec:conceitos_basicos_armazenamento}, são apresentados alguns
conceitos básicos sobre o armazenamento de dados em uma infraestrutura na nuvem,
também é apresentado um modelo de serviço que exemplifica o armazenamento em
nuvem, que é entregue sob demanda como um serviço, chamado de
{\it Data-storage-as-a-Service}.


\section{Conceitos Básicos}
\label{sec:conceitos_basicos}

Nos anos 60, a computação entrava na terceira geração de computadores, na qual
os grandes transistores foram substituídos por circuitos integrados, que
possibilitaram um grande aumento de processamento de dados, diminuição do
tamanho dos computadores e do consumo de energia elétrica~\cite{tecmundo2011}.
Com esse aumento no poder computacional e a diminuição no consumo de energia
pelos computadores, surgiu a ideia esboçada pelo especialista em inteligência
artificial John McCarthy~\cite{mtim2009}, em que a computação fosse vista como
uma utilidade pública, como os serviços básicos de água, de energia, de gás e de
telefone. Assim, o poder de processamento computacional e de armazenamento
poderiam ser disponibilizados sob demanda.

O crescimento em poder computacional e em capacidade de armazenamento alcançados
pelos computadores daquela época era cada vez maior, e a quantidade de problemas
complexos que estava sendo tratados por cientistas, físicos, biólogos e
engenheiros também estavam crescendo cada vez mais, exigindo uma demanda
computacional que muitas vezes não era disponibilizada por uma única máquina.

Essa realidade começou a ser transformada a partir da década de 70, quando
surgiram os sistemas computacionais distribuídos, que evoluíram naturalmente,
substituindo os sistemas centralizados (os chamados {\it
mainframes})~\cite{aleteia2008}.

Na década de 80, motivadas pelo alto custo de aquisição e manutenção de máquinas
paralelas, assim como pela dependência estabelecida entre o usuário e o
fabricante da máquina, as comunidades envolvidas com pesquisa em sistemas
distribuídos e computação paralela propuseram a utilização de sistemas
distribuídos como plataforma de execução paralela. Isso concretizou uma melhor
relação custo/benefício para a computação paralela, pois proporcionou menor
custo de implantação e maior poder computacional a uma ampla variedade de
aplicações~\cite{aleteia2008}.

Na década de 90, a Internet causou uma mudança drástica nos conceitos do mundo
da computação, começando com o conceito de computação paralela, mudando para a
computação distribuída depois para a computação em grade e, recentemente, a
computação em nuvem. Muitas empresas da área de tecnologia da informação
entraram nesse novo paradigma realizando implementações na nuvem. A Amazon
desempenhou um papel fundamental lançando o seu {\it Amazon Web Services} (AWS)
em 2006. Em seguida, a Google e a IBM também anunciaram planos, investimentos e
começaram projetos de pesquisa em nuvem~\cite{jadeja2012}, buscando melhorar a
utilização de recursos computacionais.

Na plataforma de nuvem, os recursos utilizados variam desde memória,
armazenamento, poder de processamento até largura de banda, sendo que todos eles
estão disponibilizados por meio da Internet, podendo serem acessados de qualquer
lugar do mundo, motivo pelo qual ocorre a associação ao termo "nuvem".

Nesse ambiente, a sua flexibilidade está na alocação dos recursos, que ocorre
sob demanda. Do ponto de vista econômico, o usuário paga apenas pela utilização
dos recursos na nuvem, sem a necessidade de utilizar os recursos de seu
computador ou servidor local. A ideia é que não seja necessário adquirir
softwares ou infraestruturas, pois é mais barato pagar apenas quando ocorre uma
demanda para a utilização deles. Para empresas isso significa uma grande redução
nos custos, podendo atingir uma economia de milhões de
dólares~\cite{olhardigital}.

No cenário da computação em nuvem, ocorre uma alternativa na forma de utilização
de serviços. Ao contrário do cenário no qual o usuário coloca serviços para
serem feitos por um servidor local, ele contrata um provedor para que ele
realize todos esses serviços. Estes serviços podem ser de armazenamento de
dados, utilização da memória e do poder de processamento da provedora para rodar
aplicações, e também infraestrutura para hospedar serviços. Com base neste
cenário, a computação em nuvem possui uma série de características na forma de
realizar seus serviços.

\subsection{Características de uma Nuvem}
\label{subsec:caracteristicas_nuvem}

A computação em nuvem representa uma nova maneira de usar os recursos
computacionais, pois ela possui os seguintes princípios:

\begin{itemize}
  \item Diversidade: ocorre a atuação em nuvens públicas, privadas e também em
  nuvens híbridas, que serão explicadas em detalhes na
  Subseção~\ref{subsec:tipos_nuvens};
  \item Compartilhamento de Infraestrutura: muitos clientes podem compartilhar a
  mesma infraestrutura, incluindo até mesmo instâncias de um aplicativo;
  \item Serviços Sob Demanda: seja por número de usuários, transações ou
  combinação entre vários itens;
  \item Preços com Base no Uso: a cobrança pelo serviço é feita de acordo com a
  quantidade e tempo dos recursos utilizados;
  \item Elasticidade: a capacidade de adicionar ou remover recursos em um 
  servidor de cada vez e com um prazo de execução de minutos ao invés
  de semanas, permitindo combinar os recursos para melhor atender a carga de
  trabalho.
  \item Escalabilidade: a capacidade de gerenciar uma quantidade
  crescente de trabalho de uma maneira eficaz, e ou a capacidade de ser
  ampliado para acomodar o crescimento.
\end{itemize}

A computação em nuvem opera sobre os conceitos de virtualização e computação
distribuída, em infraestruturas que podem ser supercomputadores, {\it clusters}
ou grades. A ideia do serviço é semelhante ao de uma rede elétrica, quanto mais
se usa, maior é o valor pago pelo uso, o qual é conhecido como modelo {\it
pay-per-use}~\cite{buyya2009}.

Existem várias empresas que já estão disponibilizando serviços de computação em
nuvem, por exemplo a Amazon~\cite{amazon2012}, a Microsoft~\cite{microsoft2012}
e a Google~\cite{googleappengine2013}.

\subsection{Arquitetura de uma Nuvem}
\label{subsec:arquitetura_nuvem}

A arquitetura de uma nuvem é composta por uma série de elementos, entre eles
estão os atores envolvidos no processo e as camadas básicas de abstração da
nuvem, onde ocorre a divisão das diferentes funções desempenhadas pelos atores e
pelas infraestruturas utilizadas por eles.

A relação entre os atores de uma nuvem pode ser vista na
Figura~\ref{fig:atores}, no qual encontram-se todos os envolvidos no processo.
Os três principais atores são os Provedores de Serviços ({\it Service
Providers}), os Usuários do Serviço e os Provedores de Infraestrutura ({\it
Infrastructure Providers}). Os provedores de infraestrutura disponibilizam um
ambiente completo no qual os provedores de serviços colocam a sua aplicação e a
deixam disponível para os usuários do serviço~\cite{vaquero2008}.

\begin{figure}[H]
\centering \includegraphics[width=15cm, height=9cm]{imagens/atores.png}\\
	\caption{Relação Entre os Atores Envolvidos em uma Nuvem~\cite{vaquero2008}.}
	\label{fig:atores}
\end{figure}

Dessa forma, uma arquitetura de computação em nuvem possui basicamente três
camadas as quais são mostradas na Figura~\ref{fig:camadas}. Nessa figura,
encontra-se próximo ao cliente o maior nível de abstração, onde ficam todas as
aplicações disponíveis. A camada mais baixa é a camada de infraestrutura, onde
estão todos os componentes físicos da nuvem (servidores, {\it data centers},
roteadores e sistemas de armazenamento). O cliente não necessita adquirir nenhum
desses componentes para rodar a sua aplicação, ele precisa somente pagar pelo
uso destes recursos de acordo com a sua necessidade, tanto de armazenamento
quanto de processamento.

A camada do meio é a camada de plataforma, a qual oferece um ambiente para o
provedor de serviço, sem que este precise se preocupar em comprar software e ter
que instalá-lo. Por meio desta plataforma eles podem controlar todos os sistemas
e ambientes necessários para o software ser desenvolvido, testado, implantado e
hospedado na web para os usuários.

A camada de aplicação é onde ocorre a interação com os usuários do serviço. As
aplicações na nuvem ficam disponíveis para acesso. Logo, o requisito mais
importante para se ter acesso ao sistema é uma conexão com a Internet.

\begin{figure}[H]
\centering
\includegraphics[width=11cm, height=6cm]{imagens/camadas.png}\\
\caption{Os Atores e as Camadas de uma Plataforma em Nuvem \cite{vaquero2008}.}
\label{fig:camadas}
\end{figure}

Assim sendo, a computação em nuvem classifica todos os seus recursos em
serviços, baseados nas camadas de abstração mostradas na
Figura~\ref{fig:camadas}. Abaixo tem-se uma breve descrição dos serviços
presentes na computação em nuvem, os quais são Software como Serviço (SaaS),
Plataforma como Serviço (PaaS) e Infraestrutura como Serviço (IaaS):

\begin{itemize}
  
	\item {Software como Serviço (SaaS):} aplicações são desenvolvidas
	especificamente para o ambiente de computação em nuvem, e são fornecidas como
	serviço por provedores para os usuários. Nesta camada os serviços podem
	utilizar os ambientes de programação fornecidos pelos provedores da camada PaaS,
	ou podem utilizar diretamente a infraestrutura fornecida pela camada IaaS. O
	acesso a essas aplicações é realizado remotamente, podendo ser acessado de
	qualquer lugar a qualquer momento. Uma cobrança pode ser feita pela utilização
	do serviço na nuvem. Entre as vantagens da SaaS estão as tarefas de manutenção,
	operação e suporte que ficam por conta do provedor do serviço~\cite{hugo2012}.
	Softwares como Google Docs~\cite{docsdrivegoogle} e Sales
	Cloud~\cite{salescloud} são algumas aplicações que exemplificam esta camada.
		  
	\item {Plataforma como Serviço (PaaS):} a plataforma como serviço permite aos
	usuários utilizar a computação em nuvem para o desenvolvimento de qualquer
	aplicação utilizando o {\it kit} de desenvolvimento fornecido pela nuvem. Os
	usuários não precisam instalar o {\it kit} na máquina local, ele já estará
	disponível na nuvem~\cite{rajan2011}, possibilitando assim o desenvolvimento de
	aplicações para nuvens, que utilizam as APIs fornecidas pelos provedores dos
	serviços, para executarem aplicações customizadas. Esses serviços disponibilizam
	uma escalabilidade impressionante a desenvolvedores e empresas que oferecem
	serviços por meio de aplicações web, e assim, aumentam a utilização de recursos
	de maneira transparente e quase instantânea, de acordo com a utilização do
	serviço, sem a necessidade de trabalho com aquisição, instalação e configuração
	de novo hardware, e nem de nova aplicação~\cite{hugo2012}.
	Microsoft Azure~\cite{microsoft2012} e Google
	AppEngine~\cite{googleappengine2013} são algumas das aplicações que
	exemplificam a camada de serviço PaaS.
	  
	\item {Infraestrutura como Serviço (IaaS):} ela fornece um ambiente para uma
	aplicação composto de hardware e software, baseado no acordo de nível de serviço
	equivalente ao uso da infraestrutura. O valor da cobrança é calculado pelo uso
	dos recursos da infraestrutura, que pode ser de tempo de processamento,
	quantidade de dados armazenados e/ou de largura de banda utilizada. O
	contratante deste serviço não corre o risco de pagar por uma infraestrutura que
	fique ociosa por várias semanas ou meses, pois só pagará por ela quando for
	utilizada. Na infraestrutura como serviço ocorre a oferta de componentes de
	hardware, {\it firewalls}, serviços de configuração, máquinas virtuais,
	etc~\cite{carlos2012}. A {\it Amazon Elastic Compute Cloud}
	(EC2)~\cite{amazon2012} e o GoogleFS~\cite{googlefs} são alguns exemplos de
	ferramentas que fornecem esta camada de serviço.
	 
\end{itemize}

\subsection{Tipos de Nuvens}
\label{subsec:tipos_nuvens}

As nuvens podem ser classificadas em três tipos de implementação, conforme
demonstrado na Figura~\ref{fig:tipos_nuvens}. A escolha de qual é o tipo
mais adequado vai depender da necessidade da aplicação que será implementada.
Os tipos de implementação de nuvens são públicas, privadas e híbridas~\cite{buyya2009}.

\begin{figure}[H]
\centering
\includegraphics[width=13cm, height=7cm]{imagens/tiposcloud.jpg}\\
\caption{Tipos de Nuvens (adaptado de Vmware~\cite{vmwarecloud}).}
\label{fig:tipos_nuvens}
\end{figure}

\begin{itemize}
  
  \item Nuvens Públicas: na nuvem pública todos os serviços podem ser acessados
  por qualquer usuário ou organização. As nuvens públicas possuem a vantagem de
  terem uma maior escalabilidade de recursos, evitando o inconveniente dos
  usuários terem que comprar equipamentos para a nuvem caso ocorra uma
  necessidade temporária de um poder de processamento maior.
  Assim, geralmente, nuvens públicas são uma boa alternativa
  quando~\cite{rajan2011}:
  
  \begin{itemize}
    \item Se deseja testar e desenvolver o código do aplicativo;
    \item Projetos colaborativos estão sendo desenvolvidos;
    \item Um aplicativo SaaS na nuvem tem uma estratégia de segurança bem implementada;
    \item Uma incrementação do aplicativo é necessária por conta do horário (a
    capacidade de adicionar mais recursos à nuvem, em horários de pico, para não
    ocorrer problemas de indisponibilidade do serviço por conta do grande número
    de acessos).
  \end{itemize}
  
  \item Nuvens Privadas: são aquelas projetadas exclusivamente para um único
  usuário ou organização. Nesse caso, a infraestrutura utilizada pertence ao
  usuário, assim ele possui total controle sobre os aplicativos que são
  implementados.
  Geralmente, elas são construídas sobre {\it data centers} privados, o que faz
  com que o usuário tenha que comprar e manter todo o software e infraestrutura
  da nuvem. Caso o usuário queira aumentar os recursos da nuvem, ele deverá
  adquirir novos equipamentos, já que a sua nuvem é limitada a sua capacidade
  física, ao contrário da nuvem pública, onde seus recursos são facilmente
  escaláveis.
  É uma boa escolha quando o negócio em questão são os dados e as aplicações da
  empresa, onde controle e segurança são fundamentais.
  
  \item Nuvens Híbridas: são combinações de nuvens públicas com
  privadas. Uma vantagem é que uma nuvem privada pode ter os seus recursos
  ampliados a partir de recursos de uma nuvem pública. Apesar dessa vantagem, a
  complexidade para se determinar a maneira como as aplicações serão
  distribuídas não é irrelevante.
  Uma grande quantidade de dados para serem processados em uma nuvem pública
  pode não ser favorável, pois pode ser muito custoso passar essa quantidade de
  uma nuvem privada para uma nuvem pública.
  
\end{itemize}

A maioria das empresas servidoras de nuvem possui as características
apresentadas nesta Seção~\ref{sec:conceitos_basicos}, apesar disso, existem
algumas divergências, que serão demonstradas na
Subseção~\ref{subsec:principais_provedores_nuvem}.

	\subsection{Comparação entre os Principais Provedores de Nuvem}
	\label{subsec:principais_provedores_nuvem}
		
			Na Tabela~\ref{table:comparativo_plataformas} tem-se algumas importantes
			características de grandes provedores de computação em nuvens, as quais são
			a Amazon~\cite{amazonaws}, a Microsoft~\cite{azure2013} e a
			Google~\cite{googleappengine2013}.
			
			\begin{table}[H]
						\caption{Comparação entre provedores de computação em
						nuvens (adaptado de G. Magalhães~\cite{guilherme2012}).}
						\label{table:comparativo_plataformas}
						\begin{tabular}{|p{0.25\textwidth}|>{\centering\arraybackslash}p{0.24\textwidth}|>{\centering\arraybackslash}p{0.2\textwidth}|>{\centering\arraybackslash}p{0.19\textwidth}|}
						\hline {\bf Serviço} & {\bf AWS} & {\bf Windows Azure} &
							   {\bf App Engine} \\  \hline {\bf Provedor} & Amazon & Microsof & Google \\ \hline
							   {\bf Lançamento} & 2002 & 2010 & 2008 \\ \hline
							   {\bf Categoria} & IaaS & PaaS & PaaS \\ \hline
							   {\bf Interface} & API e linha de comando & API & API \\ \hline
							   {\bf Licença Comercial} & Proprietário & Proprietário & Proprietário \\ \hline
							   {\bf Sistemas Operacionais Compatíveis} & Linux e Windows Server 2003 e 2008 & Windows Server 2003 e 2008 & Linux e Windows Server 2008 \\ \hline
							   {\bf Linguagens de programação suportadas} & Java, PHP, Python e Ruby & Java, PHP, Python e .NET & Java, Python e 	Go \\ \hline
							   {\bf Tempo garantido de disponibilidade} & 99,95\% & 99,90\% & 99,90\% \\ \hline										
						\end{tabular}	
			\end{table}
			
			Em relação à disponibilidade, que é uma das características essenciais em uma
			plataforma de nuvem, foi observado que a Amazon oferece o maior tempo com uma
			pequena porcentagem maior que as outras duas plataformas. Apesar disso, todas
			as três plataformas tem disponibilidade suficiente para uso em sistemas
			domésticos ou de empresas, que não dependem totalmente do serviço de
			computação em nuvem.
							
			Analisando as linguagens de programação suportadas pelas plataformas, percebe-se
			que o Java está em todas as plataformas. Provavelmente, isto ocorre pelo fato
			do Java possuir uma portabilidade própria, que faz com que um código fonte escrito
			uma única vez possa ser executado em várias plataformas diferentes, sem a
			necessidade de uma adaptação do programa. O PHP foi adotado pela Microsoft e
			pela Amazon, e isso possibilita um uso na interação dos seus bancos de dados em
			servidores hospedados na nuvem. A Google App Engine adotou a linguagem Go e
			Python, que também foram adotadas pela Amazon, ambas linguagens possibilitam
			a programação paralela~\cite{guilherme2012}.
			
			Além dessas diferenças, existem algumas restrições. Na Azure o protocolo
			ICMP~\cite{azure2013} é bloqueado, não permitindo assim, por exemplo, um
			teste de {\it ping}, teste o qual pode ser resolvido usando o utilitário
			para descoberta e auditória segura de redes, o Nmap~\cite{nmap2013}, que
			utiliza quatro técnicas para escanear o {\it ping}. A primeira técnica é
			mandar uma requisição {\it ICMP}, se não houver resposta da requisição o
			Nmap tenta um {\it TCP PING} para determinar se o {\it host} está {\it
			online} ou somente com o protocolo {\it ICMP} bloqueado mandando uma
			mensagem do tipo {\it SYN} ou {\it ACK} para qualquer porta, por padrão
			escolhe-se a 80, se o {\it RST} ou {\it SYN/ACK} retornarem, então o {\it
			host} está {\it online}.
			
			Um outro aspecto é em relação ao DNS, pois enquanto as máquinas
			virtuais da Amazon, ao serem desligadas perdem seu IP público e o DNS; na
			Azure, o DNS é mantido, designando assim um DNS único para as máquinas
			virtuais, facilitando o acesso via {\it ssh}, onde o endereço não muda se as
			máquinas forem desligadas.
			
			Mesmo com todo o potencial ofertado, as nuvens não estão conseguindo suprir 
			o aumento exponencial da quantidade de dados produzidos por pessoas,
			pois os seus recursos são limitados e os dados continuam crescendo. A partir
			deste problema surgiu a ideia das federações de nuvens, que buscam agregar
			recursos de outras nuvens, formando uma arquitetura onde os recursos dão a
			visão de que são ilimitados. Na Seção~\ref{sec:federacao_nuvens} serão
			apresentados os conceitos básicos de uma federação de nuvens.
			

\section{Federação de Nuvens}
\label{sec:federacao_nuvens}

Com o objetivo de suportar um grande número de consumidores de serviços de todo
o mundo, os provedores de infraestrutura estabeleceram centros de dados em
múltiplas localizações geográficas para fornecerem redundância e assegurar
confiabilidade em casos de falhas. A Amazon, por exemplo, possui centros de
dados nos EUA (um na Costa Leste e outro na Costa Oeste) e na Europa. No entanto,
atualmente, eles esperam que seus clientes na nuvem (os provedores de SaaS)
expressem uma preferência sobre o local que desejam hospedar os seus dados. Eles
não fornecem mecanismos automáticos para escalar os seus serviços hospedados em
vários centros de dados distribuídos geograficamente. Este tipo de abordagem
apresenta algumas deficiências:

\begin{itemize}
  \item É difícil para os clientes da nuvem determinarem com antecedência a
  melhor localização para hospedar os seus serviços;
  \item Os provedores de SaaS podem não ser capazes de atender as expectativas
  de qualidade de serviço ({\it QoS - Quality of Service}) dos consumidores que
  provenham de múltiplas localidades geográficas.
\end{itemize}

Segundo Buyya~\cite{buyya2010}, isso exige a construção de mecanismos para uma
federação de provedores de nuvens, com o objetivo de cumprir metas de qualidade
de serviços ({\it QoS}). Além disso, nenhum fornecedor de infraestrutura na
nuvem será capaz de estabelecer o seu {\it data center} em todos os locais do
mundo. Como os fornecedores de aplicativos nas nuvens terão dificuldades de
cumprir as expectativas de qualidade de serviço ({\it QoS}) para todos os
consumidores, ocorre a tentativa de realizar o melhor uso dos serviços de
múltiplos provedores de infraestrutura na nuvem, para poderem oferecer um
suporte melhor para os usuários de acordo com a sua necessidade.

\begin{figure}[H]
\centering
\includegraphics[width=16cm, height=9cm]{imagens/fases.jpg}\\
\caption{As Fases da Computação em Nuvem (segundo White E.
 et al.~\cite{cc2010}).}
\label{fig:fases_nuvem}
\end{figure}

Nesse cenário, uma federação de nuvens é uma forma de interligar ambientes de
computação em nuvem de dois ou mais provedores, com a finalidade de controlar e
balancear a demanda computacional. Para isso, é necessário um provedor para
prover recursos de uma nuvem para outra, esses podem ser temporários ou
permanentes, dependendo do acordo realizado entre as nuvens federadas. Uma
vantagem da federação é a utilização destes recursos que estariam ociosos de uma
nuvem para a outra, pois não ocorreria nenhum desperdício~\cite{cloud2011}.

A federação de nuvens, em todo o seu conceito, passou por duas fases, sendo que
existem mais duas que estão sendo trabalhadas para serem melhoradas e
padronizadas.
Na Figura~\ref{fig:fases_nuvem} tem-se as quatro fases. Na primeira nota-se os
{\it data centers} sem a utilização da tecnologia de nuvem, ou seja, eles estão
espalhados pelo mundo e realizam todo o trabalho sozinhos, contando apenas
com a infraestrutura que dispõem localmente. Não ocorre cooperação com nenhum
outro {\it data center}.

Atualmente, está ocorrendo a segunda fase, na qual encontram-se as nuvens
fornecendo os seus serviços. Na fase três, as nuvens já conseguem trocar
recursos entre si por meio de um provedor virtual que realiza todo o
balanceamento das nuvens, de forma que nenhuma fique ociosa enquanto há outras
que se encontram com a utilização máxima de seus recursos. Nesse caso uma
solicitação seria enviada para a nuvem com recursos ociosos, e esses seriam
utilizados pela nuvem sobrecarregada.

Na última fase, encontram-se as várias federações espalhadas pelo mundo, e essas
federações trabalhariam interoperando entre si, ou seja, dividindo os seus
recursos da mesma forma que uma nuvem dentro de uma federação faz. Esse conceito da fase
final formaria um cenário onde os recursos ociosos e desperdiçados na nuvem
seriam pequenos. Uma outra vantagem também seria o possível balanceamento na
carga entre as nuvens e federações, fazendo com que os usuários tenham uma ótima
experiência de uso das aplicações hospedadas nas nuvens.

Com esse conceito de federação de nuvens apresentado nesta
Seção~\ref{sec:federacao_nuvens}, foi proposta uma arquitetura de
federação em nuvens implementada por Hugo Saldanha, o BioNimbus~\cite{hugo2012},
o qual será detalhado no Capítulo~\ref{cap:bionimbus_zoonimbus}.

Em uma arquitetura de federação de nuvens, um dos principais serviços ofertados,
é o armazenamento em nuvem, serviço no qual é apresentado alguns conceitos
básicos, seguidos de um modelo que o exemplifica na
Seção~\ref{sec:conceitos_basicos_armazenamento}.

\section{Armazenamento em Nuvem}
\label{sec:conceitos_basicos_armazenamento}
		
		Um dos principais usos da computação em nuvem é o armazenamento de dados. Com o
		armazenamento em nuvem, os dados são gravados em vários servidores, podendo
		assim optar-se por armazenar em servidores terceiros, em vez de servidores de
		armazenamento tradicionais dedicados. O local de
		armazenagem pode variar dia a dia ou até mesmo minuto a minuto,
		simplesmente pelo fato da nuvem gerenciar dinamicamente o espaço de
		armazenamento disponível. Apesar da localização dos dados ser virtual, o
		usuário vê uma localização estática, e pode, realmente, controlar o seu
		espaço de armazenamento como se fosse o seu próprio computador.
		
		O armazenamento em nuvem possui algumas vantagens financeiras e de segurança
		contra desastres naturais. Em relação a segurança, os dados armazenados na
		nuvem são seguros de falhas de hardware ou apagamentos acidentais, porque eles
		são replicados em várias máquinas físicas. Como múltiplas cópias dos dados
		são mantidas continuamente, a nuvem continua a funcionar, normalmente, mesmo
		quando uma ou mais máquinas venham a ficar {\it off-line}. Esse recurso é
		chamado de {\it failover}, ou seja, se uma máquina falhar, os dados replicados
		em outras máquinas na nuvem assumem essa atividade, sem prejudicar o processo da
		atividade, tornando assim um serviço confiável e seguros.
		
		Financeiramente, os recursos virtuais na nuvem são, normalmente, mais baratos
		do que os recursos físicos de um computador pessoal ou de rede~\cite{wu2010}.
		O custo para se manter um centro de armazenamento de dados está aumentando
		de uma forma drástica, fazendo com que empresas procurem outros meios de
		armazenar seus dados. Dessa forma, uma opção mais econômica é utilizar o
		armazenamento da computação em nuvem para esta tarefa, ao invés de gerenciar
		todos os dados por uma estrutura proprietária e cara, que gasta muito mais
		em manutenção, tanto do hardware como do software. Assim, é melhor gastar
		menos com infraestrutura e serviço, comprando esses serviços sob demanda, ou seja,
		armazenamento em nuvem é simplesmente uma entrega de armazenamento
		virtualizado sob demanda, o termo formal utilizado para isso é
		{\it Armazenamento de Dados como Serviço} ({\it DaaS})~\cite{sniacdmi2012}.
		
		Os serviços de armazenamento apresentam diferentes opções. As escolhas variam
		desde arquivos tradicionais como o {\it(NFS)}, bancos de dados SQL em {\it
		clusters} locais até uma variedade de serviços na nuvem (por exemplo, a Amazon
		possui o S3, EBS, SimpleDB, RDS e ElastiCache)~\cite{alvarez2012}.

		Com o passar do tempo a forma de armazenar dados em nuvem veio sofrendo uma
		constante evolução, como pode ser demonstrado na Figura~\ref{fig:evolucao},
		gerando assim uma grande variedade de formas de como se armazenar dados em
		nuvem.
		
		\begin{figure}[H]
			\centering
			\includegraphics[width=14cm, height=10cm]{imagens/evolucao.jpg}\\
			\caption{Evolução do armazenamento de dados na nuvens
			(adaptado de J. Wu~\cite{wu2010}).}
			\label{fig:evolucao}
		\end{figure}
		
		Um modelo de serviço capaz de explicar e definir de forma geral o
		armazenamento de dados em nuvem, é o {\it Armazenamento de dados como
		Serviço}({\it Data-storage-as-a-Service - {\it DaaS}}), termo usado para
		explica os serviços ofertados por nuvens para armazenamento, e que engloba os
		serviços de armazenamento.
		
	\subsection{{\it Data-storage-as-a-Service (DaaS)}}
	\label{subsec:data_storage_service}
	
		Ao abstrair o armazenamento de dados por meio de um conjunto de interfaces de
		serviço e entregá-los sob demanda, um grande conjunto de ofertas e
		implementações são possíveis para aplicações de armazenamento em nuvem. O único
		tipo que é excluído dessa definição é aquele que, em vez de ser entregue sob
		demanda, é entregue com capacidade fixa de recursos, aplicações dedicadas.
		
		A diferença entre comprar uma aplicação dedicada e uma de armazenamento em nuvem
		não é simplesmente por ser uma interface funcional, mas também pelo motivo em
		que o armazenamento é entregue sob demanda. Os clientes pagam pelo o que eles
		estão utilizando no momento, ou o que eles alocaram para usar. No caso do
		armazenamento em bloco, a granularidade da alocação é o número de unidade
		lógica ({\it Logic Unit Number - LUN}, uma unidade endereçável ou um volume
		lógico exclusivos e discretos que possam residir dentro de um ou mais
		dispositivos de armazenamento simples ou de {\it array}~\cite{glossarysyman}).
		Para protocolos de arquivos, um sistema de arquivos é a unidade de
		granularidade. Nos dois casos, o armazenamento pode ser provisionado e
		cobrado sob demanda pela atual utilização~\cite{sniacdmi2012}.
				
		A gestão destes dados, armazenados nestes serviços de dados, muitas vezes são
		tipicamentes feitos por um tipo de gerenciamento remoto, permitindo aos
		administradores de TI se conectarem ao controlador de gerenciamento de um
		computador, quando o mesmo estiver nos modos de inatividade, ou hibernação ou se
		não tiver respondendo por meio do sistema operacional ({\it out-of-band
		management})~\cite{glossarysyman}. Por essas interfaces de padrão de
		armazenamento de dados, seja por uma {\it API} ou mais comumente, por uma
		interface administrativa baseada em navegador pode-se invocar outros serviços de
		dados como {\it snapshot} e cópia do sistema ({\it cloning}).
		
		Do grande conjunto de ofertas e implementações possíveis em nuvem, ao se
		abstrair o armazenamento de dados, por meio de um conjunto de interfaces e
		entregando-as sob demanda, deriva-se uma forma de oferta que vem se
		destacando no mercado por ser uma extensão da forma de como se armazena os
		dados das aplicações em servidores locais e de possível acesso por meio do
		SQL, denominada de {\it Database-as-a-Service}({\it DbaaS}), que se
		diferencia do {\it DaaS}, justamente por fornecer um meio de acesso aos dados
		pela linguagem SQL, ofertando assim um banco de dados em nuvem.
		
		

\section{Considerações Finais}
\label{sec:consideracoes_federacao}

Neste capítulo foram descritos os conceitos de computação em nuvens, a sua
arquitetura e os seus principais modelos de serviços. Além disso, foram
apresentados os problemas encontrados na plataforma da nuvem por conta dos seus
recursos limitados. Nesse cenário, discutiu-se também a plataforma de federação
de nuvens, que busca implantar a ideia de que os recurso são infinitos.

Dentre os desafios e problemas encontrados em uma federação de nuvens,
o armazenamento de dados é um problema em aberto, o qual foi abordado na
Seção~\ref{sec:conceitos_basicos_armazenamento}, apresentado esses conceitos
sobre a computação em nuvens e seus problemas surgiu a ideia de uma plataforma
que pudesse tentar resolver esses desafios citados, por este motivo, ela será
abordada no Capítulo~\ref{cap:bionimbus_zoonimbus} deste trabalho.
